﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SharpLite.Domain.DataInterfaces;
using DAEProde.Domain;
using DAEProde.Tasks;
using System.Web.Security;

namespace DAEProde.Web.Controllers
{
    public class ViewResultsController : Controller
    {
        private IRepository<Tournament> _tournamentRepository;
        private UserCudTasks _userMgmtTasks;
        private ResultCudTasks _resultMgmtTasks;

        public ViewResultsController(IRepository<Tournament> tournamentRepository, UserCudTasks userMgmtTasks, ResultCudTasks resultMgmtTasks)
        {
            _tournamentRepository = tournamentRepository;
            _userMgmtTasks = userMgmtTasks;
            _resultMgmtTasks = resultMgmtTasks;
        }

        //
        // GET: /ViewResults/

        public ActionResult Index()
        {
            return View(_tournamentRepository.GetAll().OrderBy(c => c.Name));
        }

        public ActionResult ViewTournamentResults(int id)
        {
            var torneo = _tournamentRepository.Get(id);

            string[] usuarios = Roles.GetUsersInRole("User");

            var listado = new List<DAEProde.Tasks.ViewModels.EditUserViewModel>();

            foreach (var usuario in usuarios)
            {
                var score = 0;
                foreach (var m in torneo.MatchDates)
                {
                    try
                    {
                        var boleta = m.Tickets.Single(t => t.UserName.Equals(usuario));

                        score += boleta.MatchDateScore;
                    }
                    catch (Exception)
                    { }
                }

                listado.Add(_userMgmtTasks.CreateEditViewModel(usuario, score));
            }

            return View(_resultMgmtTasks.CreateEditViewModel(torneo, null, listado.OrderBy(c => c.Score).Reverse()));
        }

        public ActionResult ViewMatchDateResults(int id, int fId)
        {
            var torneo = _tournamentRepository.Get(id);

            string[] usuarios = Roles.GetUsersInRole("User");

            var matchDate = new MatchDate();

            if (fId == 0)
            {
                var now = DateTime.Now;

                // Se obtiene la fecha actual. Se compara cada fecha con la fecha actual y se toma la primera que esta mas serca de la fecha actual.
                // Se tiene en cuenta 3 dias antes y 4 dias despues de cada fecha.
                matchDate = _tournamentRepository.Get(id).MatchDates.First(m => m.Date.Subtract(now).Days <= 3 && m.Date.Subtract(now).Days >= -4);
            }
            else
            {
                matchDate = torneo.MatchDates.Single(m => m.Id.Equals(fId));
            }

            var listado = new List<DAEProde.Tasks.ViewModels.EditUserViewModel>();

            foreach (var usuario in usuarios)
            {
                try
                {
                    var boleta = matchDate.Tickets.Single(t => t.UserName.Equals(usuario));

                    listado.Add(_userMgmtTasks.CreateEditViewModel(usuario, boleta.MatchDateScore));
                }
                catch (Exception)
                {
                    //si el usuario no ha jugado en esta fecha, el puntaje es 0
                    listado.Add(_userMgmtTasks.CreateEditViewModel(usuario, 0));
                }
            }

            return View(_resultMgmtTasks.CreateEditViewModel(torneo,matchDate,listado.OrderBy(c => c.Score).Reverse()));
        }

        public ActionResult ChangeMatchDate(int id, int fId)
        {
            return RedirectToAction("ViewMatchDateResults", new { id = id, fId = fId });
        }
    }
}
